Function.method('new', function () {
    //  创建一个新对象，它继承自构造器函数的原型对象
    var that = Object.create(this.prototype);

    // 调用构造器函数，绑定 -this- 到新对象上
    var other = this.apply(that, arguments);

    // 如果它的返回值不是一个对象，就返回该新对象
    return (typeof other === 'objcet' && other) || that;
});

// 定义构造器并扩充原型
var Mammal = function (name) {
    this.name = name;
};

Mammal.prototype.get_name = function () {
    return this.name;
};

Mammal.prototype.says = function () {
    return this.saying || '';
};

// 构造实例
var myMammal = new Mammal('Herb the Mammal');
var name = myMammal.get_name();

// 构造另一个伪类来继承 Mammal，这是通过定义它的 constructor 函数并替换它的 prototype 为一个 Mammal 的实例来实现的：
var Cat = function (name) {
    this.name = name;
    this.saying = 'meow';
};
// 替换 Cat.prototype 为一个新的 Mammal 实例。
Cat.prototype = new Mammal();

// 扩充新原型对象，添加 purr 和 get_name 方法
Cat.prototype.purr = function (n) {
    var i, s = '';
    for (i = 0; i < n; i += 1) {
        if (s) {
            s += '-';
        }
        s += 'r';
    }
    return s;
};
Cat.prototype.get_name = function () {
    return this.says() + ' ' + this.name + ' ' + this.says();
};

var myCat = new Cat('Henrietta');
var says = myCat.says();     // meow
var purr = myCat.purr(5);    // r-r-r-r-r
var name = myCat.get_name(); // meow Henrietta meow

// inherits 返回 this, 这样允许我们可以采用级联的形式编程。
Function.method('inherits', function (Parent) {
    this.prototype = new Parent();
    return this;
});

// 只用一行语句构造我们的 Cat 对象
var Cat = function (name) {
    this.name = name;
    this.saying = 'meow';
}
.inherits(Mammal)
.method('purr', function (n) {
    var i, s = '';
    for (i = 0; i < n; i += 1) {
        if (s) {
            s += '-';
        }
        s += 'r';
    }
    return s;    
})
.method('get_name', function () {
    return this.says() + ' ' + this.name + ' ' + this.says();
});